/*三角形类的设计与实现(组合类与组合对象)
Description
分别设计用于表示点和三角形的类：CPoint类和CTriangle类，要求如下：
（1）CPoint类中包含两个用于表示点的X和Y坐标分量的double型私有数据成员，
能够根据指定的X和Y坐标构建点对象，且能够根据指定的另一点计算两点间的距离（要求参数为常引用）。
（2）CTriangle类中包含三个用于表示三角形顶点的私有对象成员，
能够根据指定的三点构造三角形对象（要求构造函数的参数为常引用），且有计算三角形周长和面积的公有成员函数。
Input
输入的三个点的坐标构建三角形对象。
Output
输出精度为10(采用setprecision(10)设置输出精度)的三角形的周长和面积。
*/
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;

class CPoint
{
private:
    double X;
    double Y;
public:
    CPoint()
    {
        X=0;
        Y=0;
    }
    CPoint(double x,double y):X(x),Y(y){}
    //根据指定的另一点计算两点间的距离（要求参数为常引用）
    double distance(const CPoint&other)const
    {
        return sqrt((X-other.X)*(X-other.X)+(Y-other.Y)*(Y-other.Y));
    }
};

class CTriangle
{
private:
    //表示三角形的顶点
    CPoint p1;
    CPoint p2;
    CPoint p3;
    //根据指定的三点构造三角形对象
public:
    CTriangle(const CPoint&P1,const CPoint&P2,const CPoint&P3):p1(P1),p2(P2),p3(P3)
    {}
    double cal_C()const
    {
        double a=p1.distance(p2);
        double b=p2.distance(p3);
        double c=p3.distance(p1);
        return a+b+c;
    }
    double cal_S()const
    {
        double a=p1.distance(p2);
        double b=p2.distance(p3);
        double c=p3.distance(p1);
        double s=(a+b+c)/2;
        return sqrt(s*(s-a)*(s-b)*(s-c));
    }
};

int main()
{
    double x1,y1,x2,y2,x3,y3;
    if(!(cin>>x1>>y1>>x2>>y2>>x3>>y3))
    cerr<<"Error"<<endl;
    if(x1==x2&&y1==y2||x1==x3&&y1==y3||x2==x3&&y2==y3)//判断三点是否重合
    {
        cerr<<"Error"<<endl;
        return 0;
    }
    if (x1==x2&&y1==y2||x1==x3&&y1==y3||x2==x3&&y2==y3)//判断三点是否重合
    {
        cerr<<"Error"<<endl;
        return 0;
    }
    CPoint p1(x1,y1),p2(x2,y2),p3(x3,y3);
    CTriangle t(p1,p2,p3);
    cout<<setprecision(10)<<t.cal_C()<<" "<<t.cal_S()<<endl;//setprecision控制输出精度
    return 0;
}